PySpark数据框架列参考:df.col vs. df['col'] vs. F.col('col')? |
您所在的位置:网站首页 › pyspark col › PySpark数据框架列参考:df.col vs. df['col'] vs. F.col('col')? |
问题描述
我有一个概念,希望您可以帮助澄清: 参考Pyspark DataFrame中的列以下三种方法有什么区别.我知道不同的情况需要不同的形式,但不确定为什么. df.col :例如 F.count(df.col) df ['col'] :例如 df['col'] == 0 f.col('col'):例如 df.filter(F.col('col').isNull())非常感谢! 推荐答案在大多数实际应用中,几乎没有区别.但是,它们是通过对不同基础功能的调用来实现的(df = spark.createDataFrame( [(1,'a', 0), (2,'b',None), (None,'c',3)], ['col', '2col', 'third col'] ) df.show() #+----+----+---------+ #| col|2col|third col| #+----+----+---------+ #| 1| a| 0| #| 2| b| null| #|null| c| 3| #+----+----+---------+ 1. df.col 这是最不灵活的.您只能使用.运算符访问的有效列.该排除包含空格或特殊字符和列名称的列名,该名称以整数开头. 此语法调用df.__getattr__("col"). print(df.__getattr__.__doc__) #Returns the :class:`Column` denoted by ``name``. # # >>> df.select(df.age).collect() # [Row(age=2), Row(age=5)] # # .. versionadded:: 1.3使用.语法,您只能访问此示例数据框的第一列. >>> df.2col File "", line 1 df.2col ^ SyntaxError: invalid syntax在引擎盖下,它检查了是否包含df.columns中的列名,然后返回指定的pyspark.sql.Column. 2. df["col"]这致电df.__getitem__.您有更多的灵活性,因为您可以完成__getattr__可以做的所有事情,而且您可以指定任何列名. df["2col"] #Column再次,在引擎盖下检查了一些条件,在这种情况下,返回了输入字符串指定的pyspark.sql.Column. 此外,您可以作为传递多个列(如list或tuple)或列表达式. from pyspark.sql.functions import expr df[['col', expr('`third col` IS NULL')]].show() #+----+-------------------+ #| col|(third col IS NULL)| #+----+-------------------+ #| 1| false| #| 2| true| #|null| false| #+----+-------------------+请注意,对于多列,__getitem__只是呼叫 pyspark.sql.DataFrame.select . 最后,您还可以通过索引访问列: df[2] #Column 3. pyspark.sql.functions.col这是选择列并返回a expression(所有列函数的情况)的火花本地方法,该方法基于给定名称选择列.当您需要指定要列而不是字符串文字时,这是有用的速记. 例如,假设我们想制作一个新列,该列将根据"col"或"third col"的值来基于"2col"的值: 的值. from pyspark.sql.functions import when df.withColumn( 'new', f.when(df['2col'].isin(['a', 'c']), 'third col').otherwise('col') ).show() #+----+----+---------+---------+ #| col|2col|third col| new| #+----+----+---------+---------+ #| 1| a| 0|third col| #| 2| b| null| col| #|null| c| 3|third col| #+----+----+---------+---------+糟糕,这不是我的意思. Spark以为我想要字面的字符串"col"和"third col".相反,我应该写的是: from pyspark.sql.functions import col df.withColumn( 'new', when(df['2col'].isin(['a', 'c']), col('third col')).otherwise(col('col')) ).show() #+----+----+---------+---+ #| col|2col|third col|new| #+----+----+---------+---+ #| 1| a| 0| 0| #| 2| b| null| 2| #|null| c| 3| 3| #+----+----+---------+---+因为是col()创建列表达式而不检查其中有两个有趣的副作用. 它可以被重新使用,因为它不是DF特定的 可以在分配DF之前使用 age = col('dob') / 365 if_expr = when(age < 18, 'underage').otherwise('adult') df1 = df.read.csv(path).withColumn('age_category', if_expr) df2 = df.read.parquet(path)\ .select('*', age.alias('age'), if_expr.alias('age_category'))age生成Column if_expr生成Column 本文地址:https://www.itbaoku.cn/post/2032885.html |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |